﻿// Inner Fire 游戏引擎库
// GameManager - 游戏主控类
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：框架层(5)
// 用于游戏的主控制
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-01-13

#include "game_manager.h"
#include "stop_watch.h"

namespace ifire::game {

GameManager::GameManager(const std::string_view& filename)
    : info_(filename.data()), current_scene_(nullptr) {
  Stopwatch loader;
  auto& root = info_.Root();

  // 设置输入
  input_ = std::make_unique<GameInput>(this);
  // ------
  // 初始化配置信息。这些为全部载入，所以最先载入
  // ------
  config_ = std::make_unique<ConfigManager>(this, root);

  // 创建当前的Scene
  auto scene_info = config_->GetScene(root("EntryScene"));
  current_scene_ = new Scene(this, *scene_info);
  Scene::SetCurrentScene(current_scene_);

  // 初始化Assets
  assets_ = std::make_unique<Assets>(this, info_.Root());

  // ------
  // 进行配置
  // ------
  config_->Setup();
  assets_->Setup();

  // 初始化ResourceManager
  resources_ = std::make_unique<ResourceManager>(this);

  // 需要知道Scene之后，才初始化UI
  uimanager_ = std::make_unique<ui::UIManager> //
      (this, current_scene_->GetUILayout());

  // 初始化Lua管理器
  lua_manager_ = std::make_unique<LuaManager>(this);

  // 默认值配置
  empty_ui_element_ = root("EmptyUIElement");
}

XMFLOAT3 GameManager::GetSkyBoxScale() {
  return info_.Root()("SkyBoxScale", XMFLOAT3(5000.0f, 5000.0f, 5000.0f));
}

GameManager::~GameManager() {
  if (current_scene_) {
    delete current_scene_;
    current_scene_ = nullptr;
  }
}

Scene* GameManager::FindScene(ikit::sstr name) {
  for (auto& e : scenes_) {
    if (name == e->Name()) {
      return e.get();
    }
  }
  return nullptr;
}

void GameManager::OnAxisInput() {

  // 更新输入
  //
  // 获取本帧鼠标移动
  int dx, dy;
  input_->GetMouseDelta(dx, dy);
  input_->ResetMouseDelta();
  // 如果有鼠标移动，刷新Lua
  if (dx != 0 || dy != 0) {
    GetLua()->OnMouseMove(dx, dy);
  }

  // 如果有摇杆移动，刷新Lua
  float stick_x, stick_y;
  input_->GetLeftStick(stick_x, stick_y);
  // 摇杆需要有移的时候，才进行触发
  if (ikit::not_zero(stick_x) || ikit::not_zero(stick_y)) {
    GetLua()->OnLeftStick(stick_x, stick_y);
  }

  input_->GetRightStick(stick_x, stick_y);
  if (ikit::not_zero(stick_x) || ikit::not_zero(stick_y)) {
    GetLua()->OnRightStick(stick_x, stick_y);
  }
}

void GameManager::OnGamepadButtonInput() {
  input_->OnButtonEvents([this](int button_id, InputButtonEvent event) {
    GetLua()->OnGamepadButton(button_id, (int)event);
  });
}

void GameManager::LoadPathList(const ikit::XmlNode& path_list_node,
    const std::function<void(const char*)>& callback) {}

void GameManager::FixedUpdate() {
  OnAxisInput();
  OnGamepadButtonInput();

  // 检查鼠标左键
  if (input_->IsMouseButtonDown(0)) {
    // 处理射击逻辑
  }

  // 更新Scene
  CurrentScene()->FixedUpdate();

  // 处理Input状态（必须）
  input_->OnFrameEnd();
}

void GameManager::SetGraphics(dx::DxGraphics* dx) { dx_ = dx; }

void GameManager::PrintDebug(int index, const char* text, size_t len) {
  current_scene_->SetDebugMessage(index, text, len);
}

ikit::SpriteElement* GameManager::GetEmptyUIElement() {
  static ikit::SpriteElement* empty_element = nullptr;
  if (empty_element == nullptr){
    empty_element = uimanager_->GetSpriteElement(empty_ui_element_);
  }
  return empty_element;

}

} // namespace ifire::game